home *** CD-ROM | disk | FTP | other *** search
/ Maclife 157 / MACLIFE157-2001-09.ISO.7z / MACLIFE157-2001-09.ISO / Linux / MacOS Tools / Other / MakeMkPlugin / MakeMkPlugin.c < prev    next >
C/C++ Source or Header  |  2001-07-23  |  4KB  |  186 lines

  1. #include <Files.h>
  2. #include <Resources.h>
  3. #include <Folders.h>
  4. #include <StandardFile.h>
  5.  
  6. #include <stdio.h>
  7.  
  8. void        main(void);
  9. Boolean        filter(CInfoPBPtr pb);
  10.  
  11. void
  12. main(void)
  13. {
  14.     OSErr    err;
  15.     short    vRefNum;
  16.     long    parID;
  17.     FSSpec    sourceSpec;
  18.     FSSpec    destSpec;
  19.     FInfo    destInfo;
  20.     short    resfile;
  21.     Handle    rsrc;
  22.     Ptr        p;
  23.     Str255    newName = "¥pMkLinux BootX Plugin";
  24.     UInt32    size;
  25.     
  26.     printf("MakeMkPlugin 0.1¥n¥n");
  27.     printf("Searching MkLinux booter in Extensions folder....¥n");
  28.  
  29.     err = FindFolder(    kOnSystemDisk,
  30.                         kExtensionFolderType,
  31.                         false,
  32.                         &vRefNum,
  33.                         &parID);
  34.     if (err != noErr)
  35.     {
  36.         printf("Could not find Extensions folder, err: %d¥n", (int)err);
  37.         return;
  38.     }
  39.     
  40.     err = FSMakeFSSpec(vRefNum, parID, "¥pMkLinux Booter", &sourceSpec);
  41.     if (err != noErr)
  42.     {
  43.         FileFilterUPP        filterUPP;
  44.         StandardFileReply    SFR;
  45.         SFTypeList            sfTypes;
  46.         unsigned long        toto;
  47.         int                    i;        
  48.         printf("Can't find MkLinux Booter, please locate it");
  49.         fflush(stdout);
  50.         for (i=0; i<10; i++)
  51.         {
  52.             printf(".");
  53.             fflush(stdout);
  54.             Delay(15, &toto);
  55.         }
  56.         printf("¥n");
  57.         filterUPP = NewFileFilterProc(filter);
  58.         StandardGetFile(filterUPP, -1, sfTypes, &SFR);
  59.         DisposeRoutineDescriptor(filterUPP);
  60.         if (!SFR.sfGood)
  61.             return;
  62.         sourceSpec = SFR.sfFile;
  63.     }
  64.     
  65.     err = FSMakeFSSpec(vRefNum, parID, newName, &destSpec);
  66.     if (err == noErr)
  67.         FSpDelete(&destSpec);
  68.     else if (err != fnfErr)
  69.     {
  70.         printf("Error %d locating destination¥n", (int)err);
  71.         return;
  72.     }
  73.  
  74.     printf("Building ¥"%#s¥" ...¥n", newName);
  75.  
  76.     err = FileCopy(    sourceSpec.vRefNum,
  77.                     sourceSpec.parID,
  78.                     sourceSpec.name,
  79.                     destSpec.vRefNum,
  80.                     destSpec.parID,
  81.                     NULL,
  82.                     destSpec.name,
  83.                     NULL, 0,
  84.                     true);
  85.  
  86.     if (err != noErr)
  87.     {
  88.         printf("Error %d when copying file¥n", (int)err);
  89.         return;
  90.     }
  91.     
  92.     printf("Changing type/creator...¥n");
  93.     
  94.     err = FSpGetFInfo(&destSpec, &destInfo);
  95.     if (err == noErr)
  96.     {
  97.         destInfo.fdCreator    = 'BooI';
  98.         destInfo.fdType        = 'Mkli';
  99.         err = FSpSetFInfo(&destSpec, &destInfo);
  100.     }
  101.     if (err != noErr)
  102.     {
  103.         printf("Error %d when making plugin¥n", (int)err);
  104.         goto bail_delete;
  105.     }
  106.     
  107.     printf("Patching...¥n");
  108.  
  109.     resfile = FSpOpenResFile(&destSpec, fsWrPerm);
  110.     if (resfile == -1)
  111.     {
  112.         err = ResError();
  113.         printf("Error %d when opening destination file¥n", (int)err);
  114.         goto bail_delete;
  115.     }
  116.     
  117.     rsrc = Get1Resource('vers', 1);
  118.     if (rsrc == NULL)
  119.     {
  120.         err = ResError();
  121.         printf("Error %d when getting vers 1 resource¥n", (int)err);
  122.         goto bail_close;
  123.     }
  124.     
  125.     if (**((UInt32 **)rsrc) != 0x01408000)
  126.     {
  127.         printf("Cannot patch this version of MkLinux Booter, please use 1.4 !¥n");
  128.         goto bail_close;
  129.     }
  130.     
  131.     ReleaseResource(rsrc);
  132.     
  133.     rsrc = Get1Resource('INIT', 0);
  134.     if (rsrc == NULL)
  135.     {
  136.         err = ResError();
  137.         printf("Error %d when getting INIT 0 resource¥n", (int)err);
  138.         goto bail_close;
  139.     }
  140.     
  141.     size = GetHandleSize(rsrc);
  142.     SetHandleSize(rsrc, size+newName[0]+1);
  143.     BlockMoveData(newName, (*rsrc)+size, newName[0]+1);
  144.     
  145.     HLock(rsrc);
  146.     p = *rsrc;
  147.     
  148.     p += 0x1EDA;
  149.     if (*((UInt32 *)p) != 0x41FA0696)
  150.     {
  151.         err = ResError();
  152.         printf("Couldn't find expected datas in INIT resource¥n");
  153.         goto bail_close;
  154.     }
  155.     
  156.     p+=2;
  157.     *((UInt16 *)p) = size - 0x1EDA - 2;
  158.     
  159.     ChangedResource(rsrc);
  160.     WriteResource(rsrc);
  161.     
  162.     CloseResFile(resfile);
  163.     FlushVol(NULL, destSpec.vRefNum);
  164.  
  165.     printf("Done.¥n");
  166.     
  167.     return;
  168.  
  169. bail_close:    
  170.     CloseResFile(resfile);
  171. bail_delete:
  172.     FSpDelete(&destSpec);
  173.     
  174.     printf("Failed.¥n");
  175. }
  176.  
  177. Boolean
  178. filter(CInfoPBPtr pb)
  179. {
  180.     if (pb->hFileInfo.ioFlAttrib & ioDirMask)
  181.         return true;
  182.     
  183.     return (pb->hFileInfo.ioFlFndrInfo.fdType != 'scri' ||
  184.             pb->hFileInfo.ioFlFndrInfo.fdCreator != 'MkLB');
  185. }
  186.